package com.itheima.utils;

import org.apache.ibatis.session.SqlSession;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/*
    创建dao代理对象 - 支持事务管理
 */
@SuppressWarnings("all")
public class DaoInstanceFactory {

    /**
     * @param interfaceClass Dao接口Class
     * @param <T>            返回Dao代理对象
     * @return
     */
    public static <T> T getMapper(Class<T> interfaceClass) {  // StudentMapper.class

        //1. 获取SqlSession
        final SqlSession sqlSession = SqlSessionUtils.getSqlsession();
        //2. 使用框架生成代理对象
        final T mapper = sqlSession.getMapper(interfaceClass);  //真实对象
        //3. 对框架生成代理对象方法进行增强, 让其支持事务
        T proxy_mapper = (T) Proxy.newProxyInstance(mapper.getClass().getClassLoader(), new Class[]{interfaceClass}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 方法全部增强
                Object value = null;
                try {
                    // 开启事务(手动提交)
                    value = method.invoke(mapper, args);
                    // 成功: 提交事务
                    sqlSession.commit();
                } catch (Exception e) {
                    // 失败:回滚事务
                    sqlSession.rollback();
                    e.printStackTrace();
                } finally {
                    // 最后,释放资源
                    sqlSession.close();
                }
                return value;
            }
        });

        // 返回代理对象(方法全部增强了)
        return proxy_mapper;

    }
}
